#pragma once

#include "DRField.hpp"
#include <vector>

namespace Alice
{

/*
    结构体模板类接口
    这是一个抽象类
*/
class DRStructBase
{
public:
    virtual ~DRStructBase() = default;
};

/*
    结构体构造器
    这是一个模板类
    用来匹配不同类型的结构体
*/
template<class StructType>
class DRStruct : public DRStructBase
{
public:
    /*
        向结构体构造器中写入一个字段信息
    */
    template<class FieldType>
    void AddField(std::string name, FieldType StructType::*field_ptr)
    {
        m_fields.push_back(
            std::make_shared<DRField<StructType, FieldType> >(name, field_ptr)
        );
    }

    /*
        打印结构体所有字段的信息
    */
    void Info(StructType& obj)
    {
        for (auto const& iter : m_fields)
        {
            iter->Info(&obj);
        }
    }

private:
    // 存储结构体的所有字段
    std::vector<std::shared_ptr<DRFieldBase<StructType> > > m_fields;
};


} // namespace Alice
